# coding utf-8
import copy

# 直接赋值
a = [1, 2, 3]
b = a
print(id(a), a)
print(id(b), b)

a[0] = 5  # 修改的是a
print(id(a), a)
print(id(b), b)
print('===' * 10)
# 浅拷贝
'''
只对可变类型的第一层对象进行拷贝，对拷贝的对象开辟新的内存空间进行存储，不会拷贝对象内部的子对象，当子对象进行更改的时候，原始对象也会改变。
    列表的切片[:]操作、list()操作
    字典的copy()函数
    copy模块的copy()函数
'''
a = [1, 2, 3]
b = [11, 22, 33]
c = [111, 222, 333]

list01 = [a, b, c]
print('浅拷贝\n拷贝前,', id(list01))
list02 = copy.copy(list01)
# 查看list01 和 list02
print('拷贝后,', id(list01), list01)
print('拷贝后,', id(list02), list02)

print('===' * 10)
# 修改一下
a[0] = 5
print('修改后,', id(list01), list01)
print('修改后,', id(list02), list02)
print('===' * 10)
# 深拷贝
'''
只要发现对象有可变类型就会对该对象到最后一个可变类型的每一层对象就行拷贝, 对每一层拷贝的对象都会开辟新的内存空间进行存储。
    copy模块的deepcopy()函数
'''
a = [1, 2, 3]
b = [11, 22, 33]
c = [111, 222, 333]

list01 = [a, b, c]
print('深拷贝\n拷贝前,', id(list01))
list02 = copy.deepcopy(list01)
# 查看list01 和 list02
# 查看list01 和 list02
print('拷贝后,', id(list01), list01)
print('拷贝后,', id(list02), list02)

print('===' * 10)
# 修改一下
a[0] = 5
print('修改后,', id(list01), list01)
print('修改后,', id(list02), list02)
